Grupo Nº6
Integrantes: Luis Gutiérrez , Renán Pulquillanca , José Vergara.
library(dplyr)
library(ggplot2)
library(data.table)
Como seres humanos tenemos una capacidad mental básica que consiste en clasificar, agrupar y encontrar patrones frente a distintos tipos de información. Cada día lo realizamos en diferentes aspectos de nuestras vidas de forma inconsciente, por ejemplo, al conocer a una nueva persona la categorizamos a una clase o tipo de persona, pero al realizar esto podemos perder información acerca de otras características que no tomamos en consideración. Es por esto, que se pretende profundizar aún más en cómo se relacionan ciertas conductas, preferencias, hábitos, edad, etc, con el comportamiento o personalidad de las personas. A continuación, se pretenden alcanzar los siguientes objetivos para esta etapa de investigación y exploración.
Para lograr los objetivos antes mencionados se buscó un dataset que contenga información acerca de ciertas preferencias de las personas y sus características.
En el año 2013, los estudiantes de estadística de la Facultad de Ciencias Sociales y Económicas de Eslovaquia realizaron una invitación a sus amigos para responder una encuesta online o escrita que recopiló información de distintos aspectos como preferencias musicales, de películas, hobbies e intereses, fobias, hábitos alimenticios, gastos y demografía. Se puede encontrar este dataset en el siguiente enlace: https://www.kaggle.com/miroslavsabo/young-people-survey .
El Dataset llamado responses.csv consiste en 1010 filas y 150 columnas, donde 11 variables son categóricas y 139 son enteros con valores que fluctúan entre 0 a 5 . Estas 150 columnas corresponden a las 150 preguntas realizadas, y las 1010 observaciones son las 1010 personas encuestadas. A continuación, se presenta las primeras 5 filas y 6 variables del dataframe
DataFrame <- fread("datos/responses.csv")
dim(DataFrame)
## [1] 1010 150
print(DataFrame[1:5,1:6])
## Music Slow songs or fast songs Dance Folk Country Classical music
## 1: 5 3 2 1 2 2
## 2: 4 4 2 1 1 1
## 3: 5 5 2 2 3 4
## 4: 5 3 2 1 1 1
## 5: 5 3 4 3 2 4
Para explorar inicialmente, se leyeron todas las preguntas de la encuesta, y se marcaron las de interés a analizar. En este informe se mostrará la exploración de las preguntas/variables:
71: Ageing (Miedo a envejecer del 1 al 5)
76: I live a very healthy lifestyle (del 1 al 5)
104: I believe in God (del 1 al 5)
124: I am 100% happy with my life (del 1 al 5)
134: I save all the money I can (del 1 y 5)
Demográficas:
141: Age (Numeric)
145: Gender (male/Female)
En un principio, vemos cuantos datos hay por género y cómo se distribuyen estos a través de las edades.
rows_per_gender<- DataFrame %>% group_by(Gender) %>% summarise(Cantidad_Datos=n())
rows_per_gender[1,1]<- "not available"
rows_per_gender %>% ggplot(aes(Gender, Cantidad_Datos, fill= Gender)) +
geom_col() + ggtitle("Cantidad de datos por género") + geom_text(label=rows_per_gender$Cantidad_Datos)+
theme_bw()
rows_age_and_gender<-DataFrame %>% filter(Gender %in% c("female", "male")) %>% group_by(Age, Gender) %>% summarise(Cantidad_Datos=n())
rows_age_and_gender %>% ggplot(aes(Age, Cantidad_Datos, fill=Gender)) +
geom_col() + ggtitle("Cantidad de datos por edad y género") +
ylab("Cantidad de datos") +
xlab("Edad") +
theme_bw() + xlim(15, 35)
table(DataFrame$Age)
##
## 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
## 11 29 53 123 210 194 127 84 47 28 30 15 14 17 11 10
Se puede ver que la edad de los encuestados no está distribuida equitativamente, lo que puede perjudicar los casos con menor cantidad de datos.
Luego se analizó exploratoriamente las diferencias entre el promedio de distintas respuestas de hombres y mujeres según la edad. A continuación las preguntas analizadas.
DataFrame %>% filter(Gender %in% c("female","male")) %>% group_by(Age, Gender) %>% summarise(Saludable=mean(`Healthy eating`, na.rm = T)) %>%
ggplot( aes(Age, Saludable, col=Gender)) +
ggtitle("Hábitos alimenticios saludables de mujeres y hombres") +
geom_point(size=5) +
geom_smooth(method='loess', se=F) +
theme_bw() +
xlim(15,30) +
ylim(0,5)
DataFrame %>% filter(Gender %in% c("female","male")) %>% group_by(Age, Gender) %>% summarise(HAPPY =mean(`Happiness in life`, na.rm = T)) %>%
ggplot( aes(Age, HAPPY, col=Gender)) +
ggtitle("Felicidad") +
geom_point(size=5) +
geom_smooth(method='loess', se=F) +
theme_bw() +
xlim(15,30) +
ylim(0,5)
DataFrame %>% filter(Gender %in% c("female","male")) %>% group_by(Age, Gender) %>% summarise(DIOS =mean(God, na.rm = T)) %>%
ggplot( aes(Age, DIOS, col=Gender)) +
ggtitle("Creer en Dios") +
geom_point(size=5) +
geom_smooth(method='loess', se=F) +
theme_bw() +
xlim(15,30) +
ylim(0,5)
DataFrame %>% filter(Gender %in% c("female","male"), Age<30) %>% group_by(Age, Gender) %>% summarise(Saving=mean(Finances, na.rm = T)) %>%
ggplot(aes(Age,Saving, col=Gender)) +
ggtitle("Ahorro de dinero") +
# geom_line(size=1) +
geom_point(size=3) +
geom_smooth(method="loess", se = F, size=1) +
# geom_smooth(method="lm", se = F, size=2) +
theme_bw()
DataFrame %>% filter(Gender %in% c("female","male")) %>% group_by(Age, Gender) %>% summarise(Fear=mean(Ageing, na.rm = T)) %>%
ggplot( aes(Age, Fear, col=Gender)) +
ggtitle("Miedo a envejecer") +
geom_point(size=5) +
theme_bw() +
xlim(15,30) +
ylim(0,5)
DataFrame %>% filter(Gender %in% c("female","male"), Age>=17, Age<=25) %>% group_by(Age, Gender) %>% summarise(Fear=mean(Ageing, na.rm = T)) %>%
ggplot( aes(Age, Fear, col=Gender)) +
ggtitle("Miedo a envejecer, entre 17 y 25 años") +
geom_point(size=5) +
theme_bw() +
xlim(17,25) +
ylim(0,5)
Este último se realizó dos veces para ver la diferencia entre usar todos los datos, y solamente las edades que tienen datos “suficientes”, se puede ver que al usar todas las edades existen comportamientos anómalos hacia los extremos, pero al usar un rango de edad entre 17 y 25 años, se obtiene una diferencia mucho más significativa, indicando que las mujeres en promedio tienen un poco más de miedo a envejecer.
La temática principal del trabajo será encontrar patrones entre las personas encuestadas, esto será filtrando variables de interés, donde se incluirán algunas como qué tan feliz cree que es y cuánto cree en Dios, así encontrar similitudes entre estas personas, es decir, generar clusters de personas y describir las características de esos grupos.
Otra opción es intentar predecir en base al resto de las preguntas que tan feliz una personas cree que es, o que tanto cree en Dios en función al resto de las variables. Los principales riesgos de esto es tener muy pocos datos para entrenar un modelo suficientemente bueno para predecir, es decir, un modelo de clasificación podría presentar métricas bajas, lo que será analizado y más adelante.
Por último, existe la ambición de intentar identificar encuestas que están realizadas de forma aleatoria por la persona, esto puede salir del clustering, o también es posible leer un par de encuestas y clasificarlas como aleatorias o no en base a criterios propios.
PD: Los gráficos y códigos son aproximadamente 7 páginas, es decir, el reporte sería de 3 páginas pero decidimos incluir todo para una lectura más cómoda y rápida.
library(scales)
library(knitr) # Librería para mostrar la tablas de buena manera
En esta etapa del proyecto queremos centranos en encontrar patrones o grupos con características similares para entender que decribe la felicidad, entre las hipótesis pricipales tenemos que el tomar y fumar está asociado negativamente con la felicidad, y que la gente extrovertida puede ser más feliz.
para esto en primera instancia realizamos clustering con el método k means, utilizando los campos más significativos respecto a esta variable, por lo que primero ejecutamos un análisis de correlación, dejando afuera los campos categóricos de tipo “character” para facilitar los cálculos.
DF <- fread("datos/responses.csv") # Datos de las respuestas
DF_COR <- DF[,-c(74,75,108,109,133,145:150)]
Los nombres anteriores corresponde a las columas que dejamos afuera para el análisis de correlación, sin embargo, más adelante utilizaremos “Gender”. A continuación se evalua la correlación de las variables con la felicidad:
DF_COR <- na.omit(DF_COR)
corHapinness <- cor(DF_COR)[, 120] # 120 es para Hapiness
plot(corHapinness, main = "Correlación de las varibles con la felicidad",
xlab = "Índice de variable",
ylab = "Correlación con felicidad")
Ignorando la correlación de la felicidad con sigo misma, podemos ver que las variables que tienen una mayor correlación positiva se acercan a un índice de correlación de 0.5, mientras que también existen variables con índices de correlación negativos con valores cercanos a -0.5. Con esto podemos extraer un conjunto de variables que tengan sus índices de correlación con la felicidad cercanos a los extremos (0.5 y -0.5), y utilizarlas para realizar clustering. La variables que se escojen son las siguientes:
names(DF[,c(124, 125, 127, 107, 105, 61, 130, 100, 103, 112, 88, 73, 145)])
## [1] "Happiness in life" "Energy levels"
## [3] "Personality" "Number of friends"
## [5] "Dreams" "Fun with friends"
## [7] "Interests or hobbies" "Loneliness"
## [9] "Changing the past" "Mood swings"
## [11] "Fake" "Fear of public speaking"
## [13] "Gender"
La primera de estas variables es la que corresponde a la felicidad. A continuación se realiza una limpieza de los datos pasando la variable categórica “Gender” a numérica (1, 0 o NA), omitiendo los valores NA y normalizando los datos al intervalo [0, 1]:
# Omitimos valores NA
BASE_COR <- na.omit(DF[,c(124, 125, 127, 107, 105, 61, 130, 100, 103, 112, 88, 73, 145)])
# Pasar género a binario 1 -> hombre
BASE_COR$HOMBRE <- ifelse(BASE_COR$Gender=="male",1, 0)
BASE_COR$HOMBRE <- ifelse(BASE_COR$Gender=="",NA, BASE_COR$HOMBRE)
BASE_COR$HOMBRE <- as.numeric(BASE_COR$HOMBRE)
BASE_COR$Gender <- NULL
BASE_COR <- na.omit(BASE_COR) # Quitamos los Na generados en BASE_COR$HOMBRE
# Normalizamos
normalize <- function(x) { return ((x - min(x)) / (max(x) - min(x)))}
BASE_NORM <- as.data.frame(lapply(BASE_COR, normalize))
Antes de explorar clusters hechos con las variables escojidas, debemos encontrar un número k adecuado de clusters que generar, para esto utilizamos el método del codo:
# Método del codo
set.seed(2)
wss <- 0
for (i in 1:15) { # De 1 a 15 clusters
# Calculamos kmeans obteniendo su tot.withinss
KMmodel2 <- kmeans(BASE_NORM[2:12], iter.max= 20, centers = i, nstart= 20)
wss[i] <- KMmodel2$tot.withinss
}
qplot(seq_along(wss),wss) +
geom_point(size=3) + geom_line(size=1) +theme_bw()+
labs(title = "Elbow Plot (Método del codo)",
y = "withinss",
x = "k")
De acuerdo al gráfico anterior, podemos ver un sutil quiebre en k = 4, por lo que escojemos este número, pensando además en que la cantidad de elementos para un cluster no sea baja (lo que si o si sucedería con un k mayor). Con este k ahora realizamos clustering con el método de k means:
# Ejecutamos clustering:
KMmodel <- kmeans(BASE_NORM[2:12], centers = 4, nstart = 50)
# Pegamos la columna de cluster a los datos originales:
BASE_KM <- mutate(BASE_NORM, cluster = KMmodel$cluster)
A continuación reorganizamos los datos por cluster, obteniendo las medias para cada columna y los tamaños de los cluster en relación al total de datos, de esta manera podemos observar mejor la existencia de relaciones:
Tabla <- BASE_KM %>% group_by(cluster) %>% summarise(Size=percent(n()/nrow(BASE_KM)),
Happiness=mean(Happiness.in.life),
Energy.levels=mean(Energy.levels),
Personality=mean(Personality),
Number.of.friends=mean(Number.of.friends),
Dreams=mean(Dreams),
Fun.with.friends=mean(Fun.with.friends),
Interests.or.hobbies=mean(Interests.or.hobbies),
Loneliness=(mean(Loneliness)),
Changing.the.past= mean(Changing.the.past),
Mood.swings= mean(Mood.swings),
Fake= mean(Fake),
Fear.of.public.speaking= mean(Fear.of.public.speaking),
Es.hombre= mean(HOMBRE)) %>%
arrange(desc(Happiness))
kable(Tabla)
cluster | Size | Happiness | Energy.levels | Personality | Number.of.friends | Dreams | Fun.with.friends | Interests.or.hobbies | Loneliness | Changing.the.past | Mood.swings | Fake | Fear.of.public.speaking | Es.hombre |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 27.8% | 0.7933579 | 0.8228782 | 0.6503690 | 0.7795203 | 0.6291513 | 0.9200492 | 0.8625461 | 0.2832103 | 0.2518450 | 0.4271218 | 0.1854244 | 0.2333948 | 0.4981550 |
3 | 29.8% | 0.6907216 | 0.5979381 | 0.5609966 | 0.4905498 | 0.5798969 | 0.8304696 | 0.4802405 | 0.4080756 | 0.3393471 | 0.5197595 | 0.2190722 | 0.5163230 | 0.3780069 |
2 | 25.6% | 0.6470000 | 0.7370000 | 0.5760000 | 0.6590000 | 0.5400000 | 0.9213333 | 0.7450000 | 0.5410000 | 0.7650000 | 0.6670000 | 0.3260000 | 0.4790000 | 0.3720000 |
4 | 16.7% | 0.5061350 | 0.3742331 | 0.4723926 | 0.3236196 | 0.5291411 | 0.6789366 | 0.3880368 | 0.7745399 | 0.6963190 | 0.6963190 | 0.4861963 | 0.6349693 | 0.3865031 |
De la tabla anterior podemos ver claramente una diferencia en felicidad para los clusters 1 y 3 con índices de felicidad de 0.79 y 0.50 respectivamente, ambos clusters también poseen diferencias considerables en los demás campos, desde “Energy.levels” hasta “Interests.or.hobbies” el cluster 1 tiene índices notoriamente más altos que el 3, mientras que desde “Loneliness” hasta “Fear.of.public.speaking” es al revés. También podemos notar que, a pesar de que el cluster 4 tiene un mayor índice de felicidad que el cluster 2, el cluster 4 posee índices sutílmente menores que el 2 en la mayoría de las columnas “positivas” que van desde “Energy.levels” hasta “Interests.or.hobbies” y sin embargo, tiene un índice claramente más bajo en “Changing.the.past”, columna relacionada a la conformidad que una persona tiene con su vida, por lo que pensamos que este aspecto relacionado a la “conformidad” tiene un gran impacto en la felicidad de una persona. Por otra parte, notamos que el cluster 1 con mayor índice de felicidad presenta la mayor cantidad de hombres respecto al tamaño del cluster, recordemos que la encuesta posee una mayor cantidad de mujeres que hombres encuestados (una diferencia de aproximadamente 200).
Resumiendo lo anterior podemos concluir que el cluster más feliz tiene características más extrovertidas, los clusters más felices tienden a tener mayores índices para las variables “positivas” y menores para las “negativas”, la variable “Changing the past” podría tener gran influencia en la felicidad, y por último el grupo más feliz es el que presenta mayor proporción de hombres que el resto de los clusters.
También podemos asignar nombres a cada cluster, que describan sus características más importantes:
Cluster 1: los “sociables o extrovertidos”, son el grupo con mayor índice de felicidad y se caracterízan por tener altos índices en variables relacionadas a sociablilizar.
Cluster 2: los “disconformes”, son el segundo grupo menos feliz y aquel que tiene el índice de “Changing the past” más alto (0.765).
Cluster 3: los “introvertidos”, son el grupo menos feliz, presentando menores índices para las variables relacionadas a sociabilizar, y los índices más altos para las variables “negativas”. También son el grupo notablemente más pequeño de los 4.
Cluster 4: los “conformes”, son el segundo grupo más feliz y el segundo con menor índice en “Changing the past”, pero son aquel grupo en el que esta última variable demuestra un mayor peso sobre la influencia de la felicidad.
Luego del análisis con kmeans, decidimos hacer un nuevo análisis pero seleccionando 10 variables de nuestro interés y con estas utilizar clustering jerárquico para ver si podíamos sacar información diferente a la anterior.
Las 10 preguntas seleccionadas fueron :
Donde nuevamente nuestra variable de interés es la felicidad, variable 6. Estas variables fueron escogidas pensando en la salud de las personas, y que tan socialbes estas eran.
# Seleccionamos variables
BD <- DF[,c(50, 61, 74:76, 124, 137, 140, 141, 145)]
summary(BD)
## Countryside, outdoors Fun with friends Smoking
## Min. :1.000 Min. :2.000 Length:1010
## 1st Qu.:3.000 1st Qu.:4.000 Class :character
## Median :4.000 Median :5.000 Mode :character
## Mean :3.687 Mean :4.558
## 3rd Qu.:5.000 3rd Qu.:5.000
## Max. :5.000 Max. :5.000
## NA's :7 NA's :4
## Alcohol Healthy eating Happiness in life
## Length:1010 Min. :1.000 Min. :1.000
## Class :character 1st Qu.:3.000 1st Qu.:3.000
## Mode :character Median :3.000 Median :4.000
## Mean :3.032 Mean :3.706
## 3rd Qu.:4.000 3rd Qu.:4.000
## Max. :5.000 Max. :5.000
## NA's :3 NA's :4
## Entertainment spending Spending on healthy eating Age
## Min. :1.000 Min. :1.000 Min. :15.00
## 1st Qu.:2.000 1st Qu.:3.000 1st Qu.:19.00
## Median :3.000 Median :4.000 Median :20.00
## Mean :3.202 Mean :3.558 Mean :20.43
## 3rd Qu.:4.000 3rd Qu.:4.000 3rd Qu.:22.00
## Max. :5.000 Max. :5.000 Max. :30.00
## NA's :3 NA's :2 NA's :7
## Gender
## Length:1010
## Class :character
## Mode :character
##
##
##
##
En el resumen podemos ver que existen NA’s los cuales omitiremos debido a ser muy pocos, además se encontraron 3 variables en forma de caracter, nos gustaría tenerlas de forma numérica para usarlas en nuestro clustering, por lo que les dimos un valor numérico a estas variables, respetando el orden de las respuestas.
# Arreglamos variable Smoking
BD$FUMAR <- ifelse(BD$Smoking=="never smoked",0, 10)
BD$FUMAR <- ifelse(BD$Smoking=="tried smoking",1, BD$FUMAR)
BD$FUMAR <- ifelse(BD$Smoking=="former smoker",2, BD$FUMAR)
BD$FUMAR <- ifelse(BD$Smoking=="current smoker",3, BD$FUMAR)
BD$FUMAR <- ifelse(BD$Smoking=="",NA, BD$FUMAR)
# Arreglamos variable Alcohol
BD$TOMAR <- ifelse(BD$Alcohol=="never",0, 10)
BD$TOMAR <- ifelse(BD$Alcohol=="social drinker",1, BD$TOMAR)
BD$TOMAR <- ifelse(BD$Alcohol=="drink a lot",2, BD$TOMAR)
BD$TOMAR <- ifelse(BD$Alcohol=="",NA, BD$TOMAR)
# Arreglamos variable gender, 1 si es hombre.
BD$HOMBRE <- ifelse(BD$Gender=="male",1, 0)
BD$HOMBRE <- ifelse(BD$Gender=="",NA, BD$HOMBRE)
BD$HOMBRE <- as.numeric(BD$HOMBRE)
# Eliminamos variables antiguas
BD <- BD %>% select(-Smoking, -Alcohol, -Gender)
# Removemos NA's
BD <- na.omit(BD)
Ahora, normalizamos nuestras variables, ya que no todas se encuentran en la misma escala, lo que le otorgaría más peso a algunas variables de no hacerlo.
# Normalizamos nuestro df y lo asignamos a BASE_NORM
BASE_NORM <- as.data.frame(lapply(BD, normalize))
# Dado que no meteremos la variable edad al clustering la mantendremos en el formato origianl para un análisis más fácil.
BASE_NORM$Edad <- BD$Age
BASE_NORM$Age = NULL
Luego de esto, utilizamos clustering jerárquico. PD: Recordemos que tenemos 969 filas, por lo que el dendograma es bastante grande.
JER_CLUST <- hclust(dist(BASE_NORM[,-c(9,10)]), method= 'complete') # NO SE USARÁN LAS VARIABLES DE GÉNERO NI EDAD PARA HACER CLUSTER, POR ESO LAS QUITAMOS CON -c(9,10)
plot(JER_CLUST,labels = F)
Según el dendograma y nuestro criterio usaremos K=5. Crearemos un nuevo dataframe “BASE_CJ” con todas las variables y le agregaremos una nueva variable llamada cluster, que contenga a que cluster pertenece cada observación.
clusters_assign <- cutree(JER_CLUST, k=5) # Asignación a clusters
BASE_CJ <- mutate(BASE_NORM, cluster = clusters_assign) # Agregamos la variable
plot(JER_CLUST, main="Complete", xlab="", ylab="", cex=.9, labels = F)
rect.hclust(JER_CLUST, k=5, border = 2:6) # border indica los colores usados, k es el nro clusters empleados.
Hecho esto, analizamos nuestros clusters creando una tabla con cada uno de nuestros clusters, y el promedio de los puntos contenidos para cada atributo.
library(scales)
Tabla <- BASE_CJ %>% group_by(cluster) %>% summarise(Tamano=percent(n()/nrow(BASE_CJ)),
Feliz=mean(Happiness.in.life),
Fumar=mean(FUMAR),
Tomar=mean(TOMAR),
Hombre=mean(HOMBRE),
Edad=mean(Edad),
Gasto_Entretenimiento=mean(Entertainment.spending),
Divierte_con_Amigos=mean(Fun.with.friends),
Actividades_Fuera=(mean(Countryside..outdoors)),
Come_Saludable= mean(Healthy.eating),
Gasto_Comida_Saludable=mean(Spending.on.healthy.eating)) %>% arrange(desc(Feliz))
library(knitr) # Librería para mostrar la tabla de buena manera
kable(Tabla)
cluster | Tamano | Feliz | Fumar | Tomar | Hombre | Edad | Gasto_Entretenimiento | Divierte_con_Amigos | Actividades_Fuera | Come_Saludable | Gasto_Comida_Saludable |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | 40.2% | 0.7301282 | 0.6512821 | 0.6717949 | 0.4128205 | 20.83846 | 0.6493590 | 0.9179487 | 0.6884615 | 0.5493590 | 0.6961538 |
4 | 25.8% | 0.7180000 | 0.2373333 | 0.3920000 | 0.3480000 | 19.94000 | 0.3980000 | 0.9000000 | 0.7460000 | 0.6040000 | 0.7250000 |
5 | 20.2% | 0.6313776 | 0.2925170 | 0.4081633 | 0.4336735 | 20.40306 | 0.5191327 | 0.7465986 | 0.6275510 | 0.3584184 | 0.5369898 |
2 | 10.8% | 0.5571429 | 0.5206349 | 0.7619048 | 0.4761905 | 20.15238 | 0.7071429 | 0.8857143 | 0.5619048 | 0.4285714 | 0.4785714 |
3 | 2.89% | 0.3214286 | 0.3690476 | 0.4642857 | 0.3928571 | 19.92857 | 0.2410714 | 0.2738095 | 0.5178571 | 0.3750000 | 0.2500000 |
Nuestra variable de análisis es que tan feliz se declara la persona, normalizada entre 0 y 1.
El cluster 1 representa el 40% de nuestras encuesta, y presenta el mayor valor de felicidad promedio, este es un grupo de personas tiene un alto consumo de alcohol y son los que más fuman, además, a este grupo les gusta divertirse con los amigos más que a los demás grupos. “Sociables”
El cluster 4 es el segundo con mayor índice de felicidad, al contrario del cluster 1 este grupo tiene muy bajo consumo de alcohol y de cigarrillos, tienen un bajo gasto en entretenimiento, pero tienen un estilo de vida mucho más saludable, son los que están más interesados en las actividades Outdoor, comen más saludable y se preocupan más por gastar dinero para obtener comida saludable. Demográficamente es el grupo más joven y el 65% son mujeres. “Saludables”
El cluster 3 representa el 2.89% y tiene la felicidad promedio más baja, estas personas gastan MUY POCO en entretenimiento y tampoco se divierten con amigos. Tampoco están interesados en realizar actividades afuera (menos que el resto), y no se preocupan por comer saludable. “Preocupantes”
El cluster 2 es el segundo con menor felicidad y representa un 10.8% del total. Este grupo es el más interesando en Tomar alcohol y el que tiene mayor cantidad de hombres, son los que más gastan dinero en entretención y no están muy interesados en realizar actividades outdoors ni preocuparse por comer saludable. “Poco cuidadosos”
Por último el cluster 5 no destaca en nada en particular ni para bien ni para mal, pero podrían mejorar sus hábitos. " Pasivos ante la vida "
Dado los análisis realizados en esta segunda parte, los próximos pasos son realizar la encuesta con las preguntas de interés seleccionadas en la facultad, para poder ver si el comportamiento de las personas de la facultad es similar al de las personas analizadas en nuestra base de datos. Además, con esto se intentará predecir que tan feliz es alguien, y también se explorará la probabilidad de una persona de pertenecer a cada cluster.
Las hipótesis propuesta para esta estapa es la siguiente:
Para obtener los datos que nos permitan probar nuestra hipótesis se realizó una encuesta con Google Forms a partir de un subconjunto de preguntas de la encuesta original. Este subconjunto incluyó todas las preguntas involucradas en el experimento con análisis jerárquico del hito 2 y las variables más correlacionadas con la felicidad para la muestra de eslovaquia. La encuesta contenía las siguientes preguntas traducidas al español a partir de las originales:
La encueta se dinfundió a través del foro institucional de la Universidad de Chile y de la Facultad de Ciencias Físicas y Matemáticas de la misma universidad. Se obtuvieron 106 respuestas anónimas.
Luego de obtener los resultados de la encuesta, se debió realizar una limpieza y traducción de estos para poder realizar el análisis en conjunto con los datos de Eslovaquia.
# Nuevos datos ----
DF2 <- fread("datos/Encuesta de hábitos y felicidad - 2.csv")
DF2 <- DF2[DF2$"Edad (número):"!=6, ]
#summary(DF2)
#glimpse(DF2)
# Jerarquico 2----
DF2_CJ <- DF2[,c(2:10,15)]
DF2_CJ <- DF2_CJ[,c(5, 6, 7, 10, 8, 9, 3, 4, 2, 1)]
#names(DF2_CJ)
names(DF2_CJ) <- names(BASE_CJ[1:10])
# Arreglamos variable Smoking
DF2_NEW <- DF2_CJ
DF2_NEW$FUMAR <- ifelse(DF2_CJ$FUMAR=="never smoked",0, 10)
DF2_NEW$FUMAR <- ifelse(DF2_CJ$FUMAR=="tried smoking",1, DF2_NEW$FUMAR)
DF2_NEW$FUMAR <- ifelse(DF2_CJ$FUMAR=="former smoker",2, DF2_NEW$FUMAR)
DF2_NEW$FUMAR <- ifelse(DF2_CJ$FUMAR=="current smoker",3, DF2_NEW$FUMAR)
DF2_NEW$FUMAR <- ifelse(DF2_CJ$FUMAR=="",NA, DF2_NEW$FUMAR)
DF2_NEW$FUMAR <- as.numeric(DF2_NEW$FUMAR)
# Arreglamos variable Alcohol
DF2_NEW$TOMAR <- ifelse(DF2_CJ$TOMAR=="never",0, 10)
DF2_NEW$TOMAR <- ifelse(DF2_CJ$TOMAR=="social drinker",1, DF2_NEW$TOMAR)
DF2_NEW$TOMAR <- ifelse(DF2_CJ$TOMAR=="drink a lot",2, DF2_NEW$TOMAR)
DF2_NEW$TOMAR <- ifelse(DF2_CJ$TOMAR=="",NA, DF2_NEW$TOMAR)
DF2_NEW$TOMAR <- as.numeric(DF2_NEW$TOMAR)
# Arreglamos variable gender
DF2_NEW$HOMBRE <- ifelse(DF2_CJ$HOMBRE=="male",1, 0)
DF2_NEW$HOMBRE <- ifelse(DF2_CJ$HOMBRE=="",NA, DF2_NEW$HOMBRE)
DF2_NEW$HOMBRE <- as.numeric(DF2_NEW$HOMBRE)
Se realizó clustering jerárquico con los datos de Chile para ver si existe alguna equivalencia en las clases resultantes, o surgen nuevos grupos, normalizando los datos nuevamente y aplicando el mismo proceso utilizado en el hito 2.
#Funcion normalizar
normalize <- function(x) { return ((x - min(x)) / (max(x) - min(x)))}
BASE_NORM_NEW <- as.data.frame(lapply(DF2_NEW, normalize))
BASE_NORM_NEW$Edad <- DF2_NEW$Edad
# CLustering Jerárquico
JER_CLUST <- hclust(dist(BASE_NORM_NEW[,-c(9,10)]), method= 'complete')
plot(JER_CLUST,labels = F)
clusters_assign <- cutree(JER_CLUST, k=5)
BASE_CJ_NEW <- mutate(BASE_NORM_NEW, cluster = clusters_assign)
clusters_eslovaquia <- BASE_CJ_NEW %>% group_by(cluster) %>% summarise(Tamaño=percent(n()/nrow(BASE_CJ_NEW)), Feliz=mean(Happiness.in.life), Fumar=mean(FUMAR), Tomar=mean(TOMAR), Hombre=mean(HOMBRE), Edad=mean(Edad), Gasto_Entretenimiento=mean(Entertainment.spending), Divierte_con_Amigos=mean(Fun.with.friends), Come_Saludable= mean(Healthy.eating), Actividades_Fuera=(mean(Countryside..outdoors)), Gasto_Comida_Saludable=mean(Spending.on.healthy.eating)) %>% arrange(desc(Feliz))
kable(clusters_eslovaquia)
cluster | Tamaño | Feliz | Fumar | Tomar | Hombre | Edad | Gasto_Entretenimiento | Divierte_con_Amigos | Come_Saludable | Actividades_Fuera | Gasto_Comida_Saludable |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | 24.5% | 0.7900000 | 0.2266667 | 0.5600000 | 0.6800000 | 23.48000 | 0.6100000 | 0.9000000 | 0.6200000 | 0.8300000 | 0.7200000 |
5 | 4.90% | 0.6000000 | 0.4666667 | 0.9000000 | 0.6000000 | 22.40000 | 0.8500000 | 1.0000000 | 0.1500000 | 0.5500000 | 0.4000000 |
4 | 13.7% | 0.5892857 | 0.2619048 | 0.1428571 | 0.9285714 | 23.71429 | 0.1071429 | 0.3214286 | 0.6607143 | 0.4107143 | 0.8214286 |
2 | 46.1% | 0.5053191 | 0.1347518 | 0.2978723 | 0.5957447 | 22.76596 | 0.1968085 | 0.6702128 | 0.4840426 | 0.6223404 | 0.5000000 |
3 | 10.8% | 0.3863636 | 0.7878788 | 0.5454545 | 1.0000000 | 22.72727 | 0.2500000 | 0.6136364 | 0.2727273 | 0.4318182 | 0.5909091 |
A partir del clustering anterior podemos describir las clases generadas como:
De acuerdo a lo anterior vemos que las clases generadas son bastante diferentes, sin embargo se sigue notando una correlación positiva entre la la felicidad y el interés de las personas en pasar tiempo con amigos. Esto se puede deber a la diferencia entre las culturas de estos países, pero tampoco se descarta la posibilidad de haber hecho una encuesta con un N bajo, lo que nos deja en duda si es que con unas 1000 respuestas el resultado se parecería más, además, las personas que respondieron se auto seleccionaron, por lo que podría existir un sesgo debido a esto.
Se realizó un análisis entre los datos de la encuesta en Eslovaquia y los obtenidos en Chile para obtener una comparación en el rango de edades y la proporción de sexos, y entender si se parecen.
BASE_CJ_NEW$PAIS <- "CHILE"
BASE_CJ$PAIS <- "ESLOVAQUIA"
#Unimos ambas bases para compararlas
BD_FINAL <- rbind(BASE_CJ,BASE_CJ_NEW)
DFChile <- fread("datos/Encuesta de hábitos y felicidad - 2.csv")
DFChile <- DFChile[DFChile$"Edad (número):"!=6, ]
DFChile$Edad <- DFChile$"Edad (número):"
rows_age_and_gender<-DFChile %>% filter(Género %in% c("Mujer", "male")) %>% group_by(Edad, Género) %>% summarise(Cantidad_Datos=n())
rows_age_and_gender %>% ggplot(aes(Edad, Cantidad_Datos, fill=Género)) +
geom_col() + ggtitle("Cantidad de datos por edad y género para Chile") +
ylab("Cantidad de datos") +
xlab("Edad") +
theme_bw() + xlim(15,35) + scale_fill_discrete(labels=c("Hombre", "Mujer"))
# Proporción de género por país.
BD_FINAL %>% ggplot(aes(PAIS, fill=as.factor(HOMBRE))) +
geom_bar(position="fill") +
labs(title = "Proporción género") +
ylab("Proporción") +
theme_bw() +
theme(legend.title = element_blank(),
legend.text = element_text()) +
scale_fill_discrete(labels=c("Mujer","Hombre"))
De acuerdo a los gráficos anteriores, vemos que el rango de edades en Chile esta más desplazado hacia la derecha, y la proporción de sexos es totalmente diferente entre ambos países, donde en Chile la mayoría esta compuesta por hombres, mientras que para la encuesta en Eslovaquia hay una mayor cantidad de mujeres. Esto podría tener una relación con las diferencias que obtuvimos en el clustering.
A pesar de que las clases que obtuvimos como resultado del clustering jerárquico difieren entre ambos países, suponemos que las relaciones entre las variables más correlacionadas con la felicidad se mantienen para Chile, esto lo verificaremos gráficamente a continuación.
#Agregamos variable "PAIS" para identificar donde se hizo la encuesta
BASE_CJ_NEW$PAIS <- "CHILE"
BASE_CJ$PAIS <- "ESLOVAQUIA"
#Unimos ambas bases para compararlas gráficamente
BD_FINAL <- rbind(BASE_CJ,BASE_CJ_NEW)
BD_FINAL %>% group_by(PAIS,Fun.with.friends) %>% summarize(Feliz = mean(Happiness.in.life)) %>%
ggplot(aes(Fun.with.friends, Feliz, col=PAIS)) +
geom_smooth(size=1) + theme_bw() +
labs(title = "Tendencia diversión con amigos vs felicidad (Normalizada)")
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
# SUEÑOS
SUENOS_CHILE<- data.frame(DREAMS = DF2$`Siempre tengo buenos sueños.`,
FELIZ = DF2$`Estoy 100% feliz con mi vida.`,
PAIS = "CHILE")
SUENOS_ESLO <- data.frame(DREAMS = DF$Dreams,
FELIZ = DF$`Happiness in life`,
PAIS = "ESLOVAQUIA")
SUENOS <- rbind(SUENOS_CHILE, SUENOS_ESLO)
SUENOS %>% group_by(PAIS, DREAMS) %>% summarize(Feliz= mean(FELIZ, na.rm=T)) %>%
ggplot(aes(DREAMS, Feliz, col=PAIS)) +
geom_smooth(size=1) + theme_bw() +
labs(title = "Buenos sueños vs felicidad")
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
# GRAF PASADO
PASADO_CHILE<- data.frame(PASADO = DF2[,11],
FELIZ = DF2$`Estoy 100% feliz con mi vida.`,
PAIS = "CHILE")
names(PASADO_CHILE) <- c("PASADO", "FELIZ", "PAIS")
PASADO_ESLO <- data.frame(PASADO = DF$`Changing the past`,
FELIZ = DF$`Happiness in life`,
PAIS = "ESLOVAQUIA")
PASADO <- rbind(PASADO_CHILE, PASADO_ESLO)
PASADO %>% group_by(PAIS, PASADO) %>% summarize(Feliz= mean(FELIZ, na.rm=T)) %>%
ggplot(aes(PASADO, Feliz, col=PAIS)) +
geom_smooth(size=1) + theme_bw() +
labs(title = "Cambiar el pasado vs felicidad")
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
# GRAF HABLAR EN PUBLICO
PUBLICO_CHILE<- data.frame(PUBLICO = DF2$`Me da miedo hablar en público.`,
FELIZ = DF2$`Estoy 100% feliz con mi vida.`,
PAIS = "CHILE")
PUBLICO_ESLO <- data.frame(PUBLICO = DF$`Public speaking`,
FELIZ = DF$`Happiness in life`,
PAIS = "ESLOVAQUIA")
PUBLICO <- rbind(PUBLICO_CHILE, PUBLICO_ESLO)
PUBLICO %>% group_by(PAIS, PUBLICO) %>% summarize(Feliz= mean(FELIZ, na.rm=T)) %>%
ggplot(aes(PUBLICO, Feliz, col=PAIS)) +
geom_smooth(size=1) + theme_bw() +
labs(title = "Miedo a hablar en público vs felicidad")
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
En todos los gráficos se puede apreciar una tendencia similar a la de eslovaquia, lo que nos dice que existen preguntas que si están relacionadas con la felicidad sin importar la cultura.
Con respecto a nuestra hipótesis para este hito, concluimos que los resultados del clustering jerárquico hecho en el hito 2 no son aplicables a la muestra que obtuvimos con la nueva encuesta. Sin embargo, pudimos observar que varias correlaciones se mantienen a través de los datos estudiados, como por ejemplo, la correlación positiva entre la felicidad y el interés en divertirse con amigos, o la correlación negativa entre el miedo a hablar en público y la felicidad.
Por otra parte, encontramos factores que podrían ayudar a aumentar la felicidad como:
Creemos también que algunas de las variables anteriores deben tener una fuerte relación con una tercera variable, como por ejemplo la confianza, por lo que sería interesante en una próxima implementación incluir nuevas preguntas que se acerquen a estas variables relevantes.
Hemos aprendido que realizar un estudio de este tipo debe tener muy en cuenta el contexto sobre el que se realiza, por lo que una mejora a la encuesta que se utiliza debería incluir preguntas más relacionadas con la vida universitaria como por ejemplo:
También se debe tener cuidado en la formulación/redacción de una pregunta, dejándola lo menos posible a la interpretación arbitraria de quién la responde. Por último, es fundamental hacer un análisis de estos resultados y recibir indicaciones de profesionales del área de la sociología y la psicología, quienes podrían ver más valor en estos resultados de los que nosotros como ingenieros somos capaces de percibir, además proponer preguntas que serían interesantes para analizar otras directrices, cómo identificar indicios de enfermedades relacionadas con la salud mental de las personas, de ser significativos los resultados y con un equipo potente, esto podría aplicarse a universidades enteras, para tener mayor cantidad de datos y generar un diagnostico real de un establecimiento.